package javase基础;
/**
方法定义：修饰符 返回值类型 方法名称([参数类型 形参...]){
              方法体代码;
              [return 返回值];
         }
 方法不能嵌套定义
 没有方法声明一说
 **/
public class method方法 {
    //实现一个函数，检测一个年份是否为润年
    public static boolean isLeapYear(int year){
        if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0){
            return true;
        }else{
            return false;
        }
    }
    //实现一个两个整数相加的方法
    public static int add(int x,int y){
        return x+y;
    }
/*
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int ret = add(add(a,b),a);
        System.out.println(ret);
    }
 */



    /*
    //计算1！+2！+3！+4！+5！
    public static void main(String[] args) {
        int sum = 0;
        for (int i = 1; i <= 5; i++) {
            sum += fac(i);
        }
        System.out.println(sum);
    }
    public static int fac(int n){
        int result = 1;
        for (int i = 1; i <= n; i++) {
            result *= i;
        }
        return result;
    }
     */



    /*
    //交换两个整型变量
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        swap(a,b);
        System.out.println("a = " + a + "b = "+ b);
    }
    public static void swap(int x,int y){
        int temp = x;
        x = y;
        y = temp;
        System.out.println(x + " x" +  y +" y");
    }
    //得出的结果发现主函数里面x和y的值并未发生改变
    //原因是方法中的a和b只是拷贝了主函数中x和y的值，并没有拷贝地址，是传值调用
    */
    /*
    //传引用类型参数，用数组解决这个问题
    public static void main(String[] args) {
        int[] arr = {10,20};
        swap(arr);
        System.out.println("arr[0]"+arr[0] + "arr[1]" + arr[1]);
    }
    public static void swap(int[] arr){
        int temp = arr[0];
        arr[0] = arr[1];
        arr[1] = temp;
    }

     */


    /**
     * 方法重载
     * 在Java中，如果多个方法的名字相同，参数列表不同，则称该几种方法被重载了。
     * 方法名必须相同
     * 参数列表必须不同，与返回值类型是否相同无关
     */
    /*
    public static void main(String[] args) {
        add(1,2);
        add(1.5,2.5);
        add(1.5,2.5,3.5);
    }
    public static double add(double x,double y){
        return x + y;
    }
    public static double add(double x,double y,double z){
        return x+y+z;
    }

     */


    /**
     * 递归
     * 一个方法在执行过程中调用自身
     * 将原问题划分成其子问题，子问题必须要与原问题的解法相同
     * 递归出口
     */
    /*
    //递归求N的阶乘
    public static void main(String[] args) {
        int n = 5;
        int ret = factor(n);
        System.out.println(ret);
    }
    public static int factor(int N){
        if(N == 1){
            return 1;
        }else{
            return N * factor(N - 1);//调用函数自身
        }
    }

     */


    /*
    //按顺序打印一个数字的每一位
    public static void main(String[] args) {
        int num = 1234;
        print(num);
    }
    public static void print(int num){
        if (num > 9) {
            print(num/10);
        }
        System.out.println(num % 10 +" ");
    }

     */


/*
    //递归求1 + 2 + 3 + 。。。 +10
    public static void main(String[] args) {
        int num = 10;
        System.out.println(sum(num));
    }
    public static int sum(int num){
        if(num == 1){
            return 1;
        }else{
            return num + sum(num-1);
        }
    }*/



    /*
   //写一个递归方法，输入一个非负整数，返回组成他的数字之和
   public static int sum(int num){
       if(num < 10){
           return num;
       }else{
           return num % 10 + sum(num/10);
       }
   }

    public static void main(String[] args) {
        int num = 1729;
        System.out.println(sum(num));
    }

     */




    /*
    //求斐波那契数列的第N项
    public static int fib(int n){
        if(n == 1 || n == 2){
            return 1;
        }else{
            return fib(n-1) + fib(n-2);
        }
    }

    public static void main(String[] args) {
        int n = 5;
        System.out.println(fib(n));
    }

     */



    /*
    //上面的方法在处理大的斐波那契数的时候效率很低，作以修改：使用循环的方式
    public static int fib(int n){
        int last1 = 1;
        int last2 = 1;
        int cur = 0;
        for (int i = 3; i <= n; i++) {
            cur = last1 + last2;
            last1 = last2;
            last2 = cur;
        }
        return cur;
    }

    public static void main(String[] args) {
        System.out.println(fib(5));
    }

     */




}
